/**
 * File : list_view.js
 * Description : Code Javascript de list_view
 * Date : 07.08.2012 15:05:57
 * 
 * This file is part of Phenix.  Phenix is free software: you can
 * redistribute it and/or modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation, version 2.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Nils Schaetti <n.schaetti@gmail.com>
**/

/**
 * Vide la liste
 */
function ktkEmptyListView(list_view_id)
{
	// Numero de la ligne
	n_line = 0;
	
	// Nom de la première ligne
	line_id = list_view_id + 'Tr' + n_line;
	
	// Tant qu'on arrive pas à la fin des ligne
	while((line = document.getElementById(line_id)) != null)
	{
		// On supprime la ligne
		line.parentNode.removeChild(line);
		
		// Ligne suivante
		n_line++;
		line_id = list_view_id + 'Tr' + n_line;
	} 
}

/**
 * Appelée lors du démarrage d'un drag'n'drop
 * 
 * @param object event Object data transfert
 */
function dragStartHandler(event)
{
	// Élément
	var element = event.target ? event.target : event.srcElement;
	
	// Deuxième colonne
	var filename = element.childNodes[2].childNodes[0].innerHTML;
	
	// Type copy
	event.dataTransfer.effectAllowed = 'copy';
	
	// Données transmises
	event.dataTransfer.setData('text', homeCurrentDirectory + '/' + filename);
	
	return false;
}

/**
 * Appelée lorsque un drag entre sur une zone
 * 
 * @param object event Object data transfer
 */
function dragEnterHandler(event)
{
	// Élément
	var element = event.target ? event.target : event.srcElement;
	
	event.preventDefault();
	return false;
}

/**
 * Appelée lorsque un drag est au dessus d'une zone
 *
 * @param object event Object data transfer
 */
function dragOverHandler(event)
{
	// Élément
	var element = event.target ? event.target : event.srcElement;
	
	// Change de classe
	event.target.parentNode.setAttribute('class','ktkListViewTrDragOver');
	
	// On attribue l'effet de curseur qui correspond au type accepté plus haut
	event.dataTransfer.dropEffect = 'copy';
	
	// Éviter le comportement par défaut du navigateur (déplacement de sélection)
	event.preventDefault();
}

/**
 * Appelée lorsque un drag qui une zone
 * 
 * @param object event Object data transfer
 */
function dragLeaveHandler(event)
{
	// Élément
	var element = event.target ? event.target : event.srcElement;
	
	// Change de classe
	event.target.parentNode.setAttribute('class','ktkListViewTr');
}

/**
 * Appelée lorque un drag fini
 * 
 * @param object event Object data transfer
 */
function dropHandler(event)
{
	// Élément
	var element = event.target ? event.target : event.srcElement;
	
	// Ligne
	var line = element.parentNode;
	
	// Pas de redirection du naviguateur
	if(event.preventDefault)
		event.preventDefault();
	
	// On coupe manuellement la propagation de l'évènement
	event.stopPropagation();
	
	// Pas de highlight
	line.setAttribute('class','ktkListViewTr');
	
	// Deuxième colonne
	var filename = homeCurrentDirectory + '/' + line.childNodes[2].childNodes[0].innerHTML;
	
	// Content
	contentDiv = document.createElement('div');
	contentDiv.setAttribute('style','padding: 5px;');
	contentDiv.appendChild(document.createTextNode('Do you want to move ' + event.dataTransfer.getData('text') + ' to ' + filename + '?'));
	
	// Affiche une boîte de dialogue
	ktkShowDialogBox('Moving file', 'Yes', 'No', mouseX, mouseY, contentDiv, 'phenixMoveFile(\'' + event.dataTransfer.getData('text') + '\',\'' + filename + '\');', '');
	
	return false;
}

/**
 * Ajoute une ligne à la liste
 */
function ktkAppendLine(list_view_id, n_line, name)
{
	// Récupère la table
	var table = document.getElementById(list_view_id + 'Table');
	
	// Crée une ligne
	var newTr = document.createElement('tr');
	newTr.setAttribute('class','ktkListViewTr');
	newTr.setAttribute('id',list_view_id + 'Tr' + n_line);
	
	// Draggable
	newTr.setAttribute('draggable','true');
	
	// Draggable envoyée
	newTr.addEventListener('dragstart', dragStartHandler, false);
	
	// Draggable recu
	newTr.addEventListener('dragenter', dragEnterHandler, false);
	
	// Drag over
	newTr.addEventListener('dragover', dragOverHandler, false);
	
	// Drop out
	newTr.addEventListener('dragleave', dragLeaveHandler, false);
	
	// Drop
	newTr.addEventListener('drop', dropHandler, false);
	
	// Pour chaque arguments
	for(var i=2; i<arguments.length; i++)
	{
		// Cellule
		var cell = document.createElement('td');
		
		// Contenu HTML
		if(arguments[i].link == '')
			cell.innerHTML = arguments[i].html
		else
			cell.innerHTML = '<a href="' + arguments[i].link + '"/>' + arguments[i].html + '</a>';

		// Classe
		if(arguments[i].type == 'normal')
			cell.setAttribute('class','ktkListViewTd');
		else
			cell.setAttribute('class','ktkListViewTdSmall');
			
		// ID
		cell.setAttribute('id',list_view_id + arguments[i].column + n_line);
		
		// Ajoute
		newTr.appendChild(cell);
	}
	
	// Ajoute la ligne
	table.appendChild(newTr);
}

/**
 * Supprime une liste de la liste
 * 
 * @param string list_view_id Nom de la liste
 * @param int n_line Numéro de la ligne
 */
function ktkDeleteLine(list_view_id,n_line)
{
	// Nom de la première ligne
	line_id = list_view_id + 'Tr' + n_line;
	
	// On supprime la ligne
	line.parentNode.removeChild(line);
}

/**
 * Met une ligne un surbrillance
 * 
 * @param integer n_line Le numéro de la ligne à mettre en surbrillance
 */
function ktkHighlighLine(list_view_id, n_line)
{
	// Nom de la ligne
	line_id = list_view_id + 'Tr' + n_line;

	// Récupère la ligne
	line = document.getElementById(line_id);
		
	// Change l'attribut id
	if(line.getAttribute('class') == 'ktkListViewTr')
		line.setAttribute('class','ktkListViewTrFocus');
}

/**
 * Est-ce qu'une ligne est en surbrillance
 * 
 * @param integer n_line Le numéro de la ligne à mettre en surbrillance
 */
function ktkIsHighligh(list_view_id, n_line)
{
	// Nom de la ligne
	line_id = list_view_id + 'Tr' + n_line;
	
	// Récupère la ligne
	line = document.getElementById(line_id);
	
	// Change la classe de la ligne
	if(line.getAttribute('class') == 'ktkListViewTrFocus')
	{
		return true;
	}
	else
	{
		return false;
	}
}

/**
 * Met une ligne à l'état normal
 *
 * @param integer n_line Le numéro de la ligne à mettre en surbrillance
 */
function ktkUnhighlighLine(list_view_id, n_line)
{
	// Nom de la ligne
	line_id = list_view_id + 'Tr' + n_line;
	
	// Récupère la ligne
	line = document.getElementById(line_id);
		
	// Change l'attribut id
	if(line.getAttribute('class') == 'ktkListViewTrFocus')
		line.setAttribute('class','ktkListViewTr');
}

/**
 * Est-ce qu'il y a des lignes sélectionnées
 * 
 * @param string list_view Le nom de la liste
 */
function ktkListViewGetSelectedLines(list_view_id)
{
	var selectedLines = new Array();
	
	// Numero de la ligne
	n_line = 0;
	
	// Compteur tableau
	var pos = 0;
	
	// Nom de la première ligne
	line_id = list_view_id + 'Tr' + n_line;
	
	// Tant qu'on arrive pas à la fin des ligne
	while((line = document.getElementById(line_id)) != null)
	{
		// Récupère la classe de la ligne
		var classe = line.getAttribute('class');
		
		// Si c'est une ligne sélectionnée
		if(classe == 'ktkListViewTrFocus')
		{
			selectedLines[pos] = line;
			pos++;
		}
		
		// Ligne suivante
		n_line++;
		line_id = list_view_id + 'Tr' + n_line;
	} 
	
	return selectedLines;
}
